﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Siav
{
    public partial class frmPedidoNFFI : Form
    {
        public frmPedidoNFFI()
        {
            InitializeComponent();
        }

        private void CarregaCFOP(string CodigoCFOP)
        {
            using (SiavEntities Entidades = new SiavEntities())
            {
                try
                {
                    var CFOPs = Entidades.CFOP2.Where(Cod => Cod.Codigo == CodigoCFOP).FirstOrDefault();
                    txtExpCFOP.Text = CFOPs.Descricao.ToUpper();
                }
                catch
                {
                    Utilidades.Erro("Não foi possivel selecionar a tabela de CFOP's");
                }
            }
        }

        private void CarregaProdsPedido(string vNumeroPedido)
        {
            using (SiavEntities Entidades = new SiavEntities())
            {
                decimal totalV = 0;
                decimal preco = 0;
                lstProdutos.Items.Clear();
                int Codigo = int.Parse(vNumeroPedido);
                var ProdutosPedido = Entidades.PedidoDetalhes2.Where(Ped => Ped.CodigoPedido == Codigo).ToList();
                int Contador = 0;
                //var total = ProdutosPedido.Sum(Ped => Ped.ValorUnitario);
                var QtdTotal = ProdutosPedido.Sum(Ped => Ped.Quantidade);
                //txtValorTotal.Text = total.ToString();
                txtQuantidadeTotal.Text = QtdTotal.ToString();
                foreach (PedidoDetalhes2 Ped in ProdutosPedido)
                {
                    Contador++;
                    ListViewItem Item = new ListViewItem() { Text = Ped.CodProdInsercao.ToString() };
                    Item.SubItems.Add(Contador.ToString());
                    Item.SubItems.Add(Ped.Produtos2.Descricao);
                    Item.SubItems.Add(Ped.ValorUnitario.ToString());
                    Item.SubItems.Add(Ped.Quantidade.ToString());
                    decimal Qtd = decimal.Parse(Ped.Quantidade.ToString());
                    decimal Total = Ped.ValorUnitario * Qtd;
                    Item.SubItems.Add(Total.ToString());

                    lstProdutos.Items.Add(Item);
                    string Vvalor = Item.SubItems[5].Text;
                    preco = decimal.Parse(Vvalor);
                    totalV = totalV + preco;

                    txtValorTotal.Text = totalV.ToString();
                }

            }
        }

        private void CarregaDadosCliente(string vCodigoCliente)
        {
            if (vCodigoCliente == "")
            {
                //util.Erro("Informe o código do cliente antes de prossguir");
            }
            else
            {
                using (SiavEntities Entidades = new SiavEntities())
                {
                    try
                    {
                        int Codigo = int.Parse(vCodigoCliente);
                        var vCliente = Entidades.Clientes.Where(cli => cli.Codigo == Codigo).FirstOrDefault();

                        txtRazaoCliente.Text = vCliente.RazaoSocial;
                    }
                    catch
                    {
                        Utilidades.Erro("Não foi possivel localizar o cliente com o código informado, informe um código válido e tente novamente!");
                    }
                }
            }
        }

        private void CarreganatOperacao()
        {
            //using (SiavEntities Entidades = new SiavEntities())
            //{
            //    var natOP = Entidades.natOperacao.ToList();
            //    cboTipoNFe.DataSource = natOP;
            //    cboTipoNFe.DisplayMember = "NetOperacao";
            //    cboTipoNFe.ValueMember = "Codigo";
            //}
        }

        private void FormasdePagamento()
        {
            //using (SigosEntities Entidades = new SigosEntities())
            //{
            //    var Formas = Entidades.FormasPagamento.ToList();
            //    cboCodicaoPagamento.DataSource = Formas;
            //    cboCodicaoPagamento.DisplayMember = "Descricao";
            //    cboCodicaoPagamento.ValueMember = "Codigo";
            //}
        }

        public void CriarPedido()
        {
            try
            {
                using (SiavEntities Entidades = new SiavEntities())
                {
                    /////////////////
                    PedidoCabeca2 pC = new PedidoCabeca2();
                    pC.CodigoCliente = int.Parse(txtCodigoCliente.Text);
                    //pC.CondPagamento = int.Parse(cboCodicaoPagamento.SelectedValue.ToString());
                    int CFOP = int.Parse(txtNCFOP.Text.Replace(".", ""));
                    pC.CFOP = CFOP;
                    pC.Observacoes = txtObservacoes.Text;
                    pC.DataHoraPedido = DateTime.Now;
                    pC.Status = "O";
                    pC.Vendedor = Utilidades.Usuario;
                    //pC.natOperacao = int.Parse(cboTipoNFe.SelectedValue.ToString());
                    /////////////////
                    Entidades.AddObject("PedidoCabeca2", pC);
                    Entidades.SaveChanges();
                    var vUltimoPedido = (from P in Entidades.PedidoCabeca2
                                         orderby P.CodigoPedido descending
                                         select new { P.CodigoPedido }).FirstOrDefault();
                    ////////////////
                    lblNumeroPedido.Text = vUltimoPedido.CodigoPedido.ToString();
                    lblNumeroPedido.Visible = true;
                    btnFormarPedido.Enabled = false;
                    gpCliente.Enabled = false;
                    gpOutrosDados.Enabled = false;
                    btnInserirProdutos.Focus();
                    ///////////////
                }
            }
            catch (Exception ex)
            {
                Utilidades.Erro("Erro ao criar pedido, o erro foi" + ex.Message);
            }
        }

        private void CarregaPedido(string vIDPedido)
        {
            using (SiavEntities Entidades = new SiavEntities())
            {
                if (txtCodigoPedido.Text != string.Empty)
                {
                    int CodigoPedido = int.Parse(txtCodigoPedido.Text);
                    try
                    {
                        var Pedido = Entidades.PedidoCabeca2.Where(P => P.CodigoPedido == CodigoPedido).FirstOrDefault();
                        txtCodigoCliente.Text = Pedido.CodigoCliente.ToString();
                        txtRazaoCliente.Text = Pedido.Clientes.RazaoSocial;
                        //cboTipoNFe.SelectedValue = Pedido.natOperacao;
                        //txtNFeReferenciada.Text = Pedido.ChaveNFe;
                        txtNCFOP.Text = Pedido.CFOP.ToString();
                        CarregaCFOP(txtNCFOP.Text);
                        txtObservacoes.Text = Pedido.Observacoes;
                        //cboCodicaoPagamento.SelectedValue = Pedido.CondPagamento;
                        CarregaProdsPedido(txtCodigoPedido.Text);
                        lblNumeroPedido.Visible = true;
                        lblNumeroPedido.Text = Pedido.CodigoPedido.ToString();
                        gpCliente.Enabled = false;
                        gpOutrosDados.Enabled = false;
                        btnFormarPedido.Enabled = false;

                        if (Pedido.Status == "O") // Orçamento
                        {
                            btnInserirProdutos.Enabled = true;
                            btnExcluirProduto.Enabled = true;
                            btnFecharPedido.Enabled = true;
                        }

                        else if (Pedido.Status == "F") //Fechado
                        {
                            btnInserirProdutos.Enabled = false;
                            btnExcluirProduto.Enabled = false;
                            btnFecharPedido.Enabled = false;
                        }

                    }
                    catch
                    {
                        Utilidades.Erro("Impossivel Carregar o pedido selecionado");

                    }
                }
            }
        }

        private void ExcluirProduto(string vIdProduto)
        {

            if (Utilidades.Excluir())
            {
                using (SiavEntities Entidades = new SiavEntities())
                {
                    try
                    {
                        int CodigoPro = int.Parse(vIdProduto);
                        var Excluir = Entidades.PedidoDetalhes2.Where(Prod => Prod.CodProdInsercao == CodigoPro).FirstOrDefault();
                        Entidades.DeleteObject(Excluir);
                        Entidades.SaveChanges();
                        Utilidades.Informacao("Registro excluido com sucesso");
                        CarregaProdsPedido(lblNumeroPedido.Text);
                    }
                    catch
                    {
                        Utilidades.Erro("Impossivel excluir o registro selecionado");
                    }
                }
            }
        }

        private void txtCodigoCliente_KeyPress(object sender, KeyPressEventArgs e)
        {
            Utilidades.SoNumeros(e);
        }

        private void txtCodigoCliente_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                CarregaDadosCliente(txtCodigoCliente.Text);
                txtNCFOP.Focus();
            }
        }

        private void txtNCFOP_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                CarregaCFOP(txtNCFOP.Text);
            }
        }

        private void txtNCFOP_Leave(object sender, EventArgs e)
        {
            CarregaCFOP(txtNCFOP.Text);
        }

        private void btnFormarPedido_Click(object sender, EventArgs e)
        {
            CriarPedido();
        }

        private void txtCodigoCliente_Leave(object sender, EventArgs e)
        {
            CarregaDadosCliente(txtCodigoCliente.Text);
            txtNCFOP.Focus();
        }

        private void btnInserirProdutos_Click(object sender, EventArgs e)
        {
            try
            {
                Utilidades.NumeroPedido = lblNumeroPedido.Text;
                using (frmProdutosPedido BuscaProds = new frmProdutosPedido())
                {
                    BuscaProds.ShowDialog();
                    CarregaProdsPedido(Utilidades.NumeroPedido);
                }
            }
            catch
            {
                Utilidades.Erro("Houve um erro inesperado ao inserir os produtos no pedido");
            }
            finally
            {
                Utilidades.NumeroPedido = null;
            }
        }

        private void btnExcluirProduto_Click(object sender, EventArgs e)
        {
            ExcluirProduto(lstProdutos.SelectedItems[0].Text);
        }

        private void btnFecharPedido_Click(object sender, EventArgs e)
        {
            int CodigoPedidoFechar = int.Parse(lblNumeroPedido.Text);
            using (SiavEntities Entidades = new SiavEntities())
            {
                try
                {
                    bool Confirma = Utilidades.Confirmacao("O pedido será fechado! Continuar?");
                    if (Confirma == true)
                    {
                        btnInserirProdutos.Enabled = false;
                        btnExcluirProduto.Enabled = false;
                        btnFormarPedido.Enabled = false;
                        btnFecharPedido.Enabled = false;
                        btnEmitirNfe.Enabled = true;
                        var PedidoFechar = Entidades.PedidoCabeca2.Where(Pf => Pf.CodigoPedido == CodigoPedidoFechar).FirstOrDefault();
                        PedidoFechar.Status = "F"; //Fechado
                        
                        int CodigoPedido = Convert.ToInt32(lblNumeroPedido.Text);
                        var ProdutosNoPedido = Entidades.PedidoDetalhes2.Where(CodPed => CodPed.CodigoPedido == CodigoPedido).ToList();

                        foreach (PedidoDetalhes2 Dets in ProdutosNoPedido)
                        {
                            var ProdutoLoop = Entidades.Produtos2.Where(Cod => Cod.CodigoProduto == Dets.CodigoProduto).FirstOrDefault();

                            int QuantidadeEmEstoque = Convert.ToInt32(ProdutoLoop.QtdEstoque);

                            int QuantidadePedido = Convert.ToInt32(Dets.Quantidade);

                            int NovoEstoque = QuantidadeEmEstoque - QuantidadePedido;

                            ProdutoLoop.QtdEstoque = NovoEstoque;

                            Entidades.SaveChanges();
                        }
                        Entidades.SaveChanges();
                        btnEmitirNfe.Enabled = true;
                    }
                }
                catch
                {
                    Utilidades.Erro("Erro ao fechar o pedido");
                }

            }
        }

        private void btnLocalizarCliente_Click(object sender, EventArgs e)
        {
            using (frmPesquisaCliente PesqCliente = new frmPesquisaCliente())
            {
                PesqCliente.ShowDialog();
                txtCodigoCliente.Text = Utilidades.CodigoCliente.ToString();
                CarregaDadosCliente(txtCodigoCliente.Text);                
            }
        }

        private void frmPedidoNFFI_Load(object sender, EventArgs e)
        {
            CarregaCFOP(txtNCFOP.Text);
        }

        private void btnCarregarPedido_Click(object sender, EventArgs e)
        {
            CarregaPedido(txtCodigoPedido.Text);
            btnEmitirNfe.Enabled = true;
        }

        private void btnEmitirNfe_Click(object sender, EventArgs e)
        {
            
            using (frmEmiteNFFI NFE = new frmEmiteNFFI())
            {
                Utilidades.NumeroPedido = lblNumeroPedido.Text;
                NFE.ShowDialog();
            }
        }
    }
}
